#include <iostream>
using namespace std;

/*
	模板类声明成友元类
*/

class Cat
{
public:
	Cat()
	{
		name="旺财";
		age=0;
	}
	Cat(string _name,int _age)
	{
		name=_name;
		age=_age;
	}
	template<typename T>
	friend class Test;
private:
	string name;
	int age;
};

template<typename T>
class Test  //模板类 
{
public:
	Test()
	{
		cout<<"非猫的构造函数调用，申请堆空间"<<endl;
		p=new T[10]; //p=new 类型[10]
	}
	~Test()
	{
		cout<<"非猫的析构函数调用，释放堆空间"<<endl;
		delete []p;
	}
	void show()
	{
		int i;
		for(i=0; i<10; i++)
			cout<<"非猫的堆空间里面的内容是: "<<p[i]<<endl;
	}
private:
	T *p; //万能类型的指针
};

//模板类的显式具体化--》针对Cat类
template<>
class Test<Cat>
{
public:
	Test()
	{
		cout<<"针对猫的构造函数调用，申请堆空间"<<endl;
		p=new Cat[10]; //p=new Cat[10]
	}
	~Test()
	{
		cout<<"针对猫的析构函数调用，释放堆空间"<<endl;
		delete []p;
	}
	void show()
	{
		int i;
		for(i=0; i<10; i++)
		{
			cout<<"堆空间里面存放的是猫对象，猫的名字: "<<p[i].name<<"  猫的年龄: "<<p[i].age<<endl;
		}
	}
private:
	Cat *p; //万能类型的指针	
};


int main()
{
	Test<int> t1;
	Test<Cat> t2;
	
	t1.show();
	t2.show();
}